package cn.com.zero.api.auth.util;

import cn.com.zero.api.auth.constant.UserCacheKeyConstants;
import cn.com.zero.base.constant.ZeroConstants;
import cn.hutool.core.util.StrUtil;
import org.springframework.util.Assert;

/**
 * @author xiongxj
 * @version 1.0.0
 * @Description 用户缓存Key的工具类
 * @createTime 2023/3/23 11:11
 */
public class UserCacheKeyUtil {
    /**
     * Key的分隔符
     */
    private static final String KEY_SEPARATOR = "::";
    /**
     * Key的通配符
     */
    private static final String KEY_WILDCARD = "*";

    /**
     * 获取指定端的在线用户的缓存KEY
     *
     * @param side   用户所属的端，比如Manage、front等
     * @param device 用户使用的设备，比如Mobile、WEB、 PC等，为空则使用通配符替代
     * @param userId 用户ID，为空则使用通配符替代
     * @return 指定端的在线用户的缓存KEY
     */
    public static String getOnlineUserCacheKey(String side, String device, String userId) {
        Assert.notNull(side, "用户所属端信息不允许为空");
        StringBuilder stringBuilder = new StringBuilder(ZeroConstants.REDIS_CACHE_PREFIX);
        stringBuilder.append(UserCacheKeyConstants.USER_SIDE_KEY)
                .append(KEY_SEPARATOR)
                .append(side)
                .append(KEY_SEPARATOR)
                .append(UserCacheKeyConstants.USER_KEY)
                .append(KEY_SEPARATOR)
                .append(UserCacheKeyConstants.ONLINE_USER_KEY)
                .append(KEY_SEPARATOR)
                .append(UserCacheKeyConstants.LOGIN_DEVICE_KEY)
                .append(KEY_SEPARATOR);

        if (StrUtil.isEmpty(device)) {
            stringBuilder.append(KEY_WILDCARD);
        } else {
            stringBuilder.append(device);
        }

        stringBuilder.append(KEY_SEPARATOR);
        if (StrUtil.isEmpty(userId)) {
            stringBuilder.append(KEY_WILDCARD);
        } else {
            stringBuilder.append(userId);
        }

        return stringBuilder.toString();
    }

    /**
     * 获取指定端被锁定的用户的缓存KEY
     *
     * @param side   用户所属的端，比如Manage、front等
     * @param userId 用户ID，为空则使用通配符替代
     * @return 指定端的在线用户的缓存KEY
     */
    public static String getLockedUserCacheKey(String side, String userId) {
        StringBuilder stringBuilder = new StringBuilder(ZeroConstants.REDIS_CACHE_PREFIX);
        stringBuilder.append(UserCacheKeyConstants.USER_SIDE_KEY)
                .append(KEY_SEPARATOR)
                .append(side)
                .append(KEY_SEPARATOR)
                .append(UserCacheKeyConstants.USER_KEY)
                .append(KEY_SEPARATOR)
                .append(UserCacheKeyConstants.LOCKED_USER_KEY)
                .append(KEY_SEPARATOR);

        if (StrUtil.isEmpty(userId)) {
            stringBuilder.append(KEY_WILDCARD);
        } else {
            stringBuilder.append(userId);
        }
        return stringBuilder.toString();
    }

    /**
     * 获取指定端的用户token签发时间的缓存KEY
     *
     * @param side   用户所属的端，比如Manage、front等
     * @param device 用户使用的设备，比如Mobile、WEB、 PC等，为空则使用通配符替代
     * @param userId 用户ID，为空则使用通配符替代
     * @return 指定端的用户token签发时间的缓存KEY
     */
    public static String getUserTokenIssueTimeCacheKey(String side, String device, String userId) {
        StringBuilder stringBuilder = new StringBuilder(ZeroConstants.REDIS_CACHE_PREFIX);
        stringBuilder.append(UserCacheKeyConstants.USER_SIDE_KEY)
                .append(KEY_SEPARATOR)
                .append(side)
                .append(KEY_SEPARATOR)
                .append(UserCacheKeyConstants.USER_KEY)
                .append(KEY_SEPARATOR)
                .append(UserCacheKeyConstants.TOKEN_ISSUE_TIME_KEY)
                .append(KEY_SEPARATOR)
                .append(UserCacheKeyConstants.LOGIN_DEVICE_KEY);

        if (StrUtil.isEmpty(device)) {
            stringBuilder.append(KEY_WILDCARD);
        } else {
            stringBuilder.append(device);
        }
        stringBuilder.append(KEY_SEPARATOR);
        if (StrUtil.isEmpty(userId)) {
            stringBuilder.append(KEY_WILDCARD);
        } else {
            stringBuilder.append(userId);
        }
        return stringBuilder.toString();
    }

    /**
     * 获取用户无需登录的权限缓存KEY
     *
     * @param side 用户所属的端，比如Manage、front等
     * @return 用户无需登录的权限缓存KEY
     */
    public static String getPublicPermissionCacheKey(String side) {
        StringBuilder stringBuilder = new StringBuilder(ZeroConstants.REDIS_CACHE_PREFIX);
        stringBuilder.append(UserCacheKeyConstants.USER_SIDE_KEY)
                .append(KEY_SEPARATOR)
                .append(side)
                .append(KEY_SEPARATOR)
                .append(UserCacheKeyConstants.PUBLIC_PERMISSION_KEY);
        return stringBuilder.toString();
    }

    /**
     * 获取用户只要登录了就有的权限缓存KEY
     *
     * @param side 用户所属的端，比如Manage、front等
     * @return 用户只要登录了就有的权限缓存KEY
     */
    public static String getPublicLoginPermissionCacheKey(String side) {
        StringBuilder stringBuilder = new StringBuilder(ZeroConstants.REDIS_CACHE_PREFIX);
        stringBuilder.append(UserCacheKeyConstants.USER_SIDE_KEY)
                .append(KEY_SEPARATOR)
                .append(side)
                .append(KEY_SEPARATOR)
                .append(UserCacheKeyConstants.PUBLIC_LOGIN_PERMISSION_KEY);
        return stringBuilder.toString();
    }

    /**
     * 获取用户菜单权限的缓存KEY
     *
     * @param side   用户所属的端，比如Manage、front等
     * @param device 用户使用的设备，比如Mobile、WEB、 PC等，为空则使用通配符替代
     * @param userId 用户ID，为空则使用通配符替代
     * @return 指定端的用户权限的缓存KEY
     */
    public static String getMenuPermissionCacheKey(String side, String device, String userId) {
        StringBuilder stringBuilder = new StringBuilder(ZeroConstants.REDIS_CACHE_PREFIX);
        stringBuilder.append(UserCacheKeyConstants.USER_SIDE_KEY)
                .append(KEY_SEPARATOR)
                .append(side)
                .append(KEY_SEPARATOR)
                .append(UserCacheKeyConstants.USER_KEY)
                .append(KEY_SEPARATOR)
                .append(UserCacheKeyConstants.MENU_PERMISSION_KEY)
                .append(KEY_SEPARATOR)
                .append(UserCacheKeyConstants.LOGIN_DEVICE_KEY)
                .append(KEY_SEPARATOR);

        if (StrUtil.isEmpty(device)) {
            stringBuilder.append(KEY_WILDCARD);
        } else {
            stringBuilder.append(device);
        }
        stringBuilder.append(KEY_SEPARATOR);
        if (StrUtil.isEmpty(userId)) {
            stringBuilder.append(KEY_WILDCARD);
        } else {
            stringBuilder.append(userId);
        }
        return stringBuilder.toString();
    }

}
